/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.addthis.hydra.job.alert;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import com.addthis.hydra.job.alert.types.OnErrorJobAlert;
import com.addthis.hydra.job.alert.types.RekickTimeoutJobAlert;
import com.addthis.hydra.job.alert.types.RuntimeExceededJobAlert;

/**
 * BasicAlerts is used to choose the alerts that were auto generated (with the correct type) from
 * a larger Collection of alerts. Any or all contained alerts may be null. If all alerts are null,
 * {@link #isEmpty()} will return true. {@link #iterator()} allows easy iteration through all non-null
 * contained alerts.
 */
public final class BasicAlerts implements Iterable<AbstractJobAlert> {
    private OnErrorJobAlert errorAlert = null;
    private RekickTimeoutJobAlert rekickAlert = null;
    private RuntimeExceededJobAlert runtimeAlert = null;

    private final List<AbstractJobAlert> alertList;

    private BasicAlerts() {
        this.alertList = new ArrayList<>(6);
    }

    @Nullable public OnErrorJobAlert getErrorAlert() {
        return this.errorAlert;
    }

    @Nullable public RekickTimeoutJobAlert getRekickAlert() {
        return this.rekickAlert;
    }

    @Nullable public RuntimeExceededJobAlert getRuntimeAlert() {
        return this.runtimeAlert;
    }

    public static BasicAlerts create(@Nonnull Collection<AbstractJobAlert> alerts, AutoGenerated autoGenerated) {
        BasicAlerts basicAlerts = new BasicAlerts();
        alerts.forEach(alert -> {
            if (alert.autoGenerated == autoGenerated) {
                basicAlerts.alertList.add(alert);
                if (alert instanceof OnErrorJobAlert) {
                    basicAlerts.errorAlert = (OnErrorJobAlert) alert;
                } else if (alert instanceof RekickTimeoutJobAlert) {
                    basicAlerts.rekickAlert = (RekickTimeoutJobAlert) alert;
                } else if (alert instanceof RuntimeExceededJobAlert) {
                    basicAlerts.runtimeAlert = (RuntimeExceededJobAlert) alert;
                }
            }
        });
        return basicAlerts;
    }

    @Override public Iterator<AbstractJobAlert> iterator() {
        return alertList.iterator();
    }

    public boolean isEmpty() {
        return alertList.isEmpty();
    }
}
